/**
 * Copyright (C), 2007, 厦门亿力吉奥信息科技有限公司
 * File Name: Utils.js
 * Encoding UTF-8
 * Version: 1.0
 * Date: Sep 12, 2006
 * History:
 */

/**
 * 常用工具类，提供了大量静态常用方法。
 *
 * @author  陈谋坤 (chenmoukun@pdpower.com)
 * @version Revision: 1.00 Date: Sep 12, 2006
 */
Utils = Class.create();

/**
 * 设置常量
 */
Constant = Class.create();

/**
 * 价格常量，只要涉及到价格的都将其限制在该范围内
 * add by chenmk 2007.3.14
 */
Constant.PRICE = 1000000.00;

/**
 * 判断对象是否为对象
 *
 * @param Object obj 欲判断的对象
 * @return boolean true - 是对象，false - 不是对象
 */
Utils.isObject = function(obj) {
    return ( obj == null || typeof(obj) == "undefined" ) ? false : true;
};

/**
 * 判断输入是否为货币数值
 *
 * @param float money
 * @return boolean
 */
Utils.isMoney = function(money) {

    //	return /^[1-9][0-9]*\.[0-9]{2}/.test(money) ||
    //		   /^0\.[0-9]{2}/.test(money);

    //	/*
    //	 * change by chenmk 2006.11.29
    //	 * 上面的方法有错误,如88.88.88
    //	 */
    //	return Utils.isFloatValue(money);

    return /^(([1-9]\d*)|0)(\.\d{1,2})?$/.test(money);
};

/**
 * 判断一个对象是不是函数对象
 *
 * @param fun 对象
 * @return boolean
 */
Utils.isFunction = function(fun) {
    return (fun != null && typeof(fun) == "function");
};

/**
 * 判断是否为整数
 */
Utils.isInteger = function(num) {
    return /^[1-9][0-9]*$/.test(num) || num == '0';
};

/**
 * 判断字符串中是否含有特殊字符(不全)
 */
Utils.isContainSpecialCharacter = function(str) {
    return /^[^\\\/\^\"\'\.\|\?\*@%#\(\)\s]+$/.test(str);
};

/**
 * 根据传进来的一组复选框表单元素，判断该组复选框是否有被选中
 * add by chenmk 2007.1.10
 */
Utils.isAnyChecked = function(checkboxElements) {

    if (checkboxElements == null || checkboxElements.length == 0)
        return false;

    for (var i = 0; i < checkboxElements.length; i++) {
        if (checkboxElements[i].checked)
            return true;
    }

    return false;
};

/**
 * 判断一个数组是否包含了特定的值
 *
 * @param values
 * @param value
 */
Utils.contains = function(values, value) {
    for (var i = 0; i < values.length; i++) {
        if (values[i] == value)
            return true;
    }

    return false;
};

/**
 * 判断一个数值（或字符串）是否为非负数。
 *
 */
Utils.isNonNegative = function(num) {

    return /^[1-9][0-9]*$/.test(num) || num == 0;
};

Utils.isCharacter = function(str) {

    var reg = /^\w+$/;
    if (!reg.test(str)) {
        return false;
    }
    return true;
};

/**
 * 验证字符串是否为空
 *
 * @param 需要验证的字符串
 * @return 布尔值
 */
Utils.isEmpty = function(str) {
    if (str == null || str.trim().length == 0)
        return true;
    else
        return false;
};

Utils.isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") > -1);
Utils.isSafari = (/webkit|khtml/).test(navigator.userAgent.toLowerCase());
Utils.isIE = (!Utils.isOpera && navigator.userAgent.toLowerCase().indexOf("msie") > -1);
Utils.isIE5 = (Utils.isIE && /msie 5\.0/i.test(navigator.userAgent));
Utils.isIE7 = (!Utils.isOpera && navigator.userAgent.toLowerCase().indexOf("msie 7") > -1);
Utils.isGecko = (!Utils.isSafari && navigator.userAgent.toLowerCase().indexOf("gecko") > -1);
Utils.isKHtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);


/**
 * 获取某HTML元素的符合指定样式名称的第一个父元素。
 *
 * @param HTMLElement 需要匹配的HTML元素
 * @param String className 匹配的样式名称
 * @return HTMLElement 返回符合条件的父元素，或返回空
 */
Utils.getParentByClassName = function(el, className) {
    if (!el)
        return null;

    var e = el.parentNode;
    if (e.className == className)
        return e;

    Utils.getParentByClassName(e, className);
};

/**
 * 获取某HTMLElement下指定样式的子元素集合
 *
 * @param HTMLElment el
 * @param String className
 * @return Array
 */
Utils.getChildrenByClassName = function(el, className) {
    if (!el)
        return null;

    var children = new Array();
    for (var i = 0; i < el.childNodes.length; i++) {
        if (el.childNodes[i].className == className)
            children.push(el.childNodes[i]);
    }

    return children;
};

/**
 *
 */
Utils.ScriptFragmentRegExp = new RegExp(Prototype.ScriptFragment, 'img');

/**
 * 在指定的字符串中执行其中包含的脚本。
 *
 * @param String str
 */
Utils.evalScripts = function(str) {
    var scripts = str.match(Utils.ScriptFragmentRegExp);

    if (scripts) {
        match = new RegExp(Prototype.ScriptFragment, 'im');
        setTimeout((function() {
            for (var i = 0; i < scripts.length; i++)
                eval(scripts[i].match(match)[1]);
        }).bind(this), 10);
    }
};

/**
 * 删除指定字符串中的所有脚本块。
 *
 * @param String str
 * @return String
 */
Utils.omitScriptFragment = function(str) {
    return str.replace(Utils.ScriptFragmentRegExp, '');
};

Utils.getComputedStyle = function(str) {
    var reg = /[0-9]+/i;
    var value = str.match(reg);

    return (value == null) ? 0 : parseInt(value);
};

/**
 * 获取某个元素的绝对坐标。
 *
 * @param HMTLElement el
 * @return Object
 */
Utils.getAbsolutePos = function(el) {
    var SL = 0, ST = 0;
    var is_div = /^div$/i.test(el.tagName);
    if (is_div && el.scrollLeft)
        SL = el.scrollLeft;
    if (is_div && el.scrollTop)
        ST = el.scrollTop;
    var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
    if (el.offsetParent) {
        var tmp = this.getAbsolutePos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }

    return r;
};

/**
 * 验证是否为浮点数
 *
 * @param String str
 * @return boolean
 */
Utils.isFloatValue = function(floatValue) {

    var reg = /(^((-|\+)?0\.)(\d*)$)|(^((-|\+)?[1-9])+\d*(\.\d*)?$)/;

    return reg.test(floatValue);
};

/**
 * HTML页面中比较龌龊的元素
 * 这里去掉了iframe ; update by chenmk
 */
Utils.TERRIABLE_ELEMENTS = new Array("applet", "select");

/**
 * 屏蔽HTML页面中比较龌龊的元素，如applet、iframe、select。
 * 由于Div在显示在这些元素之上，会出现破坏Div元素的情形，因此将在Div元素下的这些龌龊的元素隐藏。
 *
 * @param HTMLEelement el 需要屏蔽龌龊元素的HTMLElement对象
 */
Utils.hideShowCovered = function(el) {
    function getVisib(obj) {
        var value = obj.style.visibility;
        if (!value) {
            if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
                if (!Utils.isKHtml)
                    value = document.defaultView.
                            getComputedStyle(obj, "").getPropertyValue("visibility");
                else
                    value = '';
            } else if (obj.currentStyle) { // IE
                value = obj.currentStyle.visibility;
            } else
                value = '';
        }
        return value;
    }

    ;

    var p = Utils.getAbsolutePos(el);
    var EX1 = p.x;
    var EX2 = el.offsetWidth + EX1;
    var EY1 = p.y;
    var EY2 = el.offsetHeight + EY1;

    for (var k = Utils.TERRIABLE_ELEMENTS.length; k > 0;) {
        var ar = document.getElementsByTagName(Utils.TERRIABLE_ELEMENTS[--k]);
        var cc = null;

        for (var i = ar.length; i > 0;) {
            cc = ar[--i];

            p = Utils.getAbsolutePos(cc);
            var CX1 = p.x;
            var CX2 = cc.offsetWidth + CX1;
            var CY1 = p.y;
            var CY2 = cc.offsetHeight + CY1;

            if (self.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
                if (!cc.__msh_save_visibility) {
                    cc.__msh_save_visibility = getVisib(cc);
                }
                cc.style.visibility = cc.__msh_save_visibility;
            } else {
                if (!cc.__msh_save_visibility) {
                    cc.__msh_save_visibility = getVisib(cc);
                }
                cc.style.visibility = "hidden";
            }
        }
    }
};

/**
 *
 *
 */
Utils.calculateStringWidth = function(str) {
    if (StringUtils.isEmpty(str))
        return null;

    var span = document.createElement("span");
    span.innerHTML = str;
    document.body.appendChild(span);

    var width = span.offsetWidth;
    document.body.removeChild(span);

    return width;
};

Utils.autoFitImage = function(img, maxWidth, maxHeight) {
	var image=new Image();
		image.src=img.src;
	if(image.width>0 && image.height>0){
		var rate = (maxWidth/image.width < maxHeight/image.height)?maxWidth/image.width:maxHeight/image.height;
		if(rate <= 1){
			img.width = image.width*rate;
			img.height = image.height*rate;
		} else {
			img.width = image.width;
			img.height = image.height;
		}
	}
};

/**
 * 移除HTML元素对象中所有子元素
 *
 * @param htmlObj HTML元素对象
 */
Utils.removeChildren = function(htmlObj) {
    if (!Utils.isObject(htmlObj) && !Utils.isObject($(htmlObj)))
        return;

    while (htmlObj.hasChildNodes()) {
        htmlObj.removeChild(htmlObj.childNodes[0]);
    }
};

/**
 * 更新HTML元素对象的innerHTML。
 * 在更新内容之前，删除其包含的所有子节点。
 *
 * @param htmlObj
 * @param str
 */
Utils.updateElementInnerHTML = function(htmlObj, str) {

    if (!Utils.isObject(htmlObj) && !Utils.isObject($(htmlObj)))
        return;

    Utils.removeChildren(htmlObj);
    htmlObj.innerHTML = str;
};

/**
 * 在给定的URL后加上时间搓，防止页面没有重新加载，而是使用缓存的页面
 */
Utils.getUncacheUrl = function(url) {

    if (url == null)
        return null;

    if (url.indexOf("?") != -1)
        url += "&" + (new Date()).getTime();
    else
        url += "?" + (new Date()).getTime();

    return url;
};


/*
 * 取得单选框选中的值 
 */
Utils.getRadioHtmlValue = function(oRadioObj) {
    retValue = "";
    if (!Utils.isObject(oRadioObj)) {
        alert("单选框Html对象参数为空");
        return "";
    }

    //判断单选按钮的长度是否为Null
    if (!Utils.isObject(oRadioObj.length)) {
        if (oRadioObj.checked) retValue = oRadioObj.value;
    } else {
        for (var i = 0; i <= oRadioObj.length - 1; i++) {
            if (oRadioObj[i].checked) {
                retValue = oRadioObj[i].value;
                break;
            }
        }
    }
    return retValue;
};


/*
 * 取得复选框选中的值
 */
Utils.getCheckBoxHtmlValue = function(oCheckBoxObj, sSplitStr) {
    retValue = "";
    if (!Utils.isObject(oCheckBoxObj)) {
        alert("复选框Html对象参数为空");
        return "";
    }

    if (!Utils.isObject(sSplitStr)) {
        sSplitStr = "|";
    }

    //判断单选按钮的长度是否为Null
    if (!Utils.isObject(oCheckBoxObj.length)) {
        if (oCheckBoxObj.checked) retValue = oCheckBoxObj.value;
    } else {
        for (var i = 0; i <= oCheckBoxObj.length - 1; i++) {
            if (oCheckBoxObj[i].checked) {
                if (retValue == "") {
                    retValue = oCheckBoxObj[i].value;
                } else {
                    retValue = retValue + sSplitStr + oCheckBoxObj[i].value;
                }
            }
        }
    }

    return retValue;
};

/*
 *  功能: 判断Select对象中是否村Value=pOptionValue的Option对象
 *  参数:
 *  返回:
 */
Utils.isExtandOptionObj = function(pSelectObj, pOptionValue) {
    for (var i = 0; i < pSelectObj.options.length; i++) {
        if (pSelectObj.options[i].value.trim() == pOptionValue.trim()) {
            return true;
        }
    }
    return false;
};

/*
 *  功能: 把psValue和psText组合成为Option HTML对象
 *  参数: psValue: Option的Value值
 *        psText: Option的Text值
 *  返回:
 */
Utils.makeOptionObj = function(psValue, psText) {
    var optionObj = document.createElement("OPTION");
    optionObj.value = psValue;
    optionObj.text = psText;
    return optionObj;
};

/*
 *  功能: 清空Select对象中所有的Option对象
 *  参数:
 *  返回:
 */
Utils.removeAllOptionObj = function(pSelectObj) {
    if (pSelectObj != null) {
        for (var i = pSelectObj.options.length - 1; i >= 0; i--)
            pSelectObj.options.remove(i);
    }
};

/*
 *  功能: 删除Select对象中选中的Option对象
 *  参数:
 *  返回:
 */
Utils.delSelectedOptionObj = function(pSelectObj) {
    var delIndexArr = new Array();
    var tmpj = 0;
    if (pSelectObj != null) {
        for (var i = 0; i < pSelectObj.options.length; i++)
            if (pSelectObj.options[i].selected) {
                //pSelectObj.options.remove(i);
                delIndexArr[tmpj] = pSelectObj.options[i];
                tmpj = tmpj + 1;
            }
    }

    for (var j = 0; j < delIndexArr.length; j++) {
        for (var i = 0; i < pSelectObj.options.length; i++) {
            if (delIndexArr[j] == pSelectObj.options[i]) {
                pSelectObj.options.remove(i);
            }
        }
    }

};

/*
 *  功能: 往Select对象中添加封装在数组中的Option对象
 *  参数:
 *  返回:
 */
Utils.addSelectOption = function(pSelectObj, value, text) {
    var oOption = Utils.makeOptionObj(value, text);
    pSelectObj.options.add(oOption);
};

/*
 * 动态加载js文件
 */
Utils.loadScriptFile = function(jsSrc) {
    var oHead = document.getElementsByTagName('head')[0];
    var oScript = document.createElement('script');
    oScript.type = "text/javascript";
    oScript.id = jsSrc;
    oScript.src = jsSrc;
    oHead.appendChild(oScript);
};

/*------------------- FormUtil add by chenmk 2010.07.20 ------------------------------*/
FormUtil = {};
/**
 * 根据给定的表单ID来取得该表单的快照
 * @param formId
 * @return 该表单的值，格式为{section: 'blog', tag: ['javascript', 'prototype', 'doc']}对象
 */
FormUtil.generateSnapshot = function(formId){
	if(formId == null || formId.trim() == ""){
		alert("表单ID为空，无法取得当前表单的值，请先设置表单值");
		return false;
	}
	
	return Form.serialize(formId).toQueryParams() || {};	//存储的格式为：{section: 'blog', tag: ['javascript', 'prototype', 'doc']}
};

/**
 * 比较两个快照是否一致
 * @param snapshotMap1 快照1的值，格式为{section: 'blog', id: '45'}对象
 * @param snapshotMap2 快照2的值，格式为{section: 'blog', id: '45'}对象
 * @return 如果两个快照的值一致，则返回true，否则返回false
 */
FormUtil.compareSnapshot = function(snapshotMap1, snapshotMap2){
	if(snapshotMap1 == null || snapshotMap2 == null){
		alert("您传入的快照值有空数据，无法比对");
		return;
	}
	
	if(snapshotMap1.length != snapshotMap2.length)
		return false;
	
	var formElValue1 = null;	
	var formElValue2 = null;	
	for(formName in snapshotMap1){
		formElValue1 = snapshotMap1[formName] || "";
		formElValue2 = snapshotMap2[formName] || "";
		if(formElValue1.trim() != formElValue2.trim()){
			return false;
		}
	}
	
	return true;
};

/*------------------- String ------------------------------*/


/**
 * 去除字符串中的头尾空白字符
 *
 */
if (!String.prototype.trim) {
    String.prototype.trim = function() {
        return  this.replace(/(^\s*)|(\s*$)/g, "");
    };
};

/**
 * 根据显示字符串的容器的宽度，自动截取字符串。
 *
 * @param int containerWidth 显示字符串的容器的宽度
 * @return String
 */
String.prototype.substrByContainerWidth = function(containerWidth) {
    var titleWidth = Utils.calculateStringWidth(this);
    if (titleWidth > containerWidth) {
        var length = parseInt(this.length * (containerWidth / titleWidth));
        return this.substr(0, length - 1);
    } else
        return this;
};

/**
 * 判断字符串是否以某个字符串开始
 *
 * @param String prefix
 * @return boolean
 */
if (!String.startWith) {
    String.prototype.startWith = function(str) {
        if (str == null) {
            return false;
        } else {
            return this.substring(0, str.length) == str;
        }
    };
};

/*----------------- StringUtils ----------------------------*/


var StringUtils = Class.create();

StringUtils.isEmpty = function(str) {
    return (!Utils.isObject(str) || str.length == 0) ? true : false;
};

//把psSourceString中字符串中的psFromString字符串替换成psToString字符串
StringUtils.replaceSubstring = function(psSource, psFrom, psTo) {
    var lpos = 0;
    while (psSource.indexOf(psFrom) > -1) {
        lpos = psSource.indexOf(psFrom);
        psSource = "" + (psSource.substring(0, lpos) + psTo + psSource.substring((lpos + psFrom.length), psSource.length));
    }
    if (psSource.substring(psSource.length - psFrom.length, psSource.length) == " " + psFrom.substring(0, psFrom.length - 1))
        psSource = "" + psSource.substring(0, psSource.length - psFrom.length + 1) + psTo.substring(0, psTo.length - 1);
    return psSource;
};

//返回空串
StringUtils.getNullBlankStr = function(psString) {
    if (StringUtils.isEmpty(psString)) {
        return "";
    } else {
        return psString;
    }
};

//获取符号byte长度
StringUtils.getByteLen = function(sStr) {
    var len = 0;

    if (StringUtils.isEmpty(sStr)) {
        return 0;
    }

    for (var i = 0; i < sStr.length; i++) {
        if (sStr.charCodeAt(i) > 255) {
            len += 2;
        }
        else {
            len++;
        }
    }
    return len;
};
/**
 * 根据传入的中文取得拼音名称 add by chenmk 2009.12.25
 * 
 * @param
 */
StringUtils.generatePy = function(title){
	var result = "";
	try{			
		title = title || "";	
		if(title.trim() == "")
			result = "";
		else{
			var qpAndPyszmArray = top.GpmsHzpyMap.getQpAndPyszm(title);
			var pyszmItemArray = qpAndPyszmArray[top.GpmsHzpyMap.PYSZM_FLAG];
				
			if(pyszmItemArray == null || pyszmItemArray.length == 0)
				result = "";
			else
				result = pyszmItemArray[0];
		}
	}catch(e){
	}finally{
	}
	return result;
};

/*---------------------- Date ------------------------------*/

var DateUtils = Class.create();

/**
 * 格式化日期
 *
 * @param {} str 如2008160315
 * @param {} format 必须按java的格式 yyyy-MM-dd HH:mm:ss
 * @return {}
 */
DateUtils.format = function(str, format) {

    if (!format) {
        format = "yyyy-MM-dd";
    }

    if (str == null || str.trim() == "")
        return "";
        
    str = str.replace(/\W+/g, ""); //无格式的字符串
    var result = format;
    var year = format.replace(/[^y]/g, "");
    var month = format.replace(/[^M]/g, "");
    var day = format.replace(/[^d]/g, "");
    var hour = format.replace(/[^H]/g, "");
    var min = format.replace(/[^m]/g, "");
    var second = format.replace(/[^s]/g, "");
    
    var zeroStr = "0000";
    
    var yearLength = year == null ? 0 : year.length;
    if(yearLength > 0){
    	result = result.replace(year, str.substr(0, yearLength) || zeroStr.substring(0, yearLength));
    	str = str.substr(yearLength);
    }
    
    var monthLength = month == null ? 0 : month.length;
    if(monthLength > 0){
    	result = result.replace(month, str.substr(0, monthLength) || zeroStr.substring(0, monthLength));
    	str = str.substr(monthLength);
    }
    
    var dayLength = day == null ? 0 : day.length;
    if(dayLength > 0){
    	result = result.replace(day, str.substr(0, dayLength) || zeroStr.substring(0, dayLength));
    	str = str.substr(dayLength);
    }
    
    var hourLength = hour == null ? 0 : hour.length;
    if(hourLength > 0){
    	result = result.replace(hour, str.substr(0, hourLength) || zeroStr.substring(0, hourLength));
    	str = str.substr(hourLength);
    }
    
    var minLength = min == null ? 0 : min.length;
    if(minLength > 0){
    	result = result.replace(min, str.substr(0, minLength) || zeroStr.substring(0, minLength));
    	str = str.substr(minLength);
    }
    
    var secondLength = second == null ? 0 : second.length;
    if(secondLength > 0){
    	result = result.replace(second, str.substr(0, secondLength) || zeroStr.substring(0, secondLength));
    	str = str.substr(secondLength);
    }

    return result;
};

/** Date interval constant @static @type String */
DateUtils.SECOND = "s";
/** Date interval constant @static @type String */
DateUtils.MINUTE = "mi";
/** Date interval constant @static @type String */
DateUtils.HOUR = "h";
/** Date interval constant @static @type String */
DateUtils.DAY = "d";
/** Date interval constant @static @type String */
DateUtils.MONTH = "mo";
/** Date interval constant @static @type String */
DateUtils.YEAR = "y";

/**
 * 取得指定的日期
 * @param str 要转换的相对时间 字符串型
 * @param interval 要加减的日期
 * @param value    要加减的值
 * @return Date类型的日期
 */
DateUtils.getDate = function(str, interval, value) {
	if (str == null || str.trim() == "")
        return null;

    str = str.trim();
    var length = str.length;
    var result = new Date();
    if (length >= 4)
        result.setFullYear(parseInt(str.substr(0, 4), 10));
    if (length >= 6)
        result.setMonth(parseInt(str.substr(4, 2), 10) - 1);
    if (length >= 8)
        result.setDate(parseInt(str.substr(6, 2), 10));
    if (length >= 10)
        result.setHours(parseInt(str.substr(8, 2), 10));
    if (length >= 12)
        result.setMinutes(parseInt(str.substr(10, 2), 10));
    if (length >= 14)
        result.setSeconds(parseInt(str.substr(12, 2), 10));
        
    result = DateUtils.addDate(result, interval, value);
        
    return result;
};

/**
 * 取得指定的日期
 * @param dateObj 要转换的相对时间 Date类型
 * @param interval 要加减的日期
 * @param value    要加减的值
 * @return Date类型的日期
 */
DateUtils.addDate = function(dateObj, interval, value) {
	if (dateObj == null)
        return null;
        
    result = dateObj;
        
    if (interval == DateUtils.YEAR)
        result.setFullYear(result.getFullYear() + value);
    if (interval == DateUtils.MONTH)
        result.setMonth(result.getMonth() + value);
    if (interval == DateUtils.DAY)
        result.setDate(result.getDate() + value);
    if (interval == DateUtils.HOUR)
        result.setHours(result.getHours() + value);
    if (interval == DateUtils.MINUTE)
        result.setMinutes(result.getMinutes() + value);
    if (interval == DateUtils.SECOND)
        result.setSeconds(result.getSeconds() + value);
        
    return result;
};

/**
 * 日期加减
 *
 * @param {} str
 * @param {} interval
 * @param {} value
 * @return {String}
 */
DateUtils.add = function(str, interval, value) {

    if (str == null || str.trim() == "")
        return "";

    str = str.trim();
    var length = str.length;
    var dateObj = DateUtils.getDate(str, interval, value);

    var result = "";
    if (length >= 4)
        result = dateObj.getFullYear();
    if (length >= 6) {
        var mo = dateObj.getMonth() + 1;
        if (mo < 10)
            result += "0";
        result += "" + mo;
    }
    if (length >= 8) {
        var d = dateObj.getDate();
        if (d < 10)
            result += "0";
        result += "" + d;
    }
    if (length >= 10) {
        var h = dateObj.getHours();
        if (h < 10)
            result += "0";
        result += "" + h;
    }
    if (length >= 12) {
        var mi = dateObj.getMinutes();
        if (mi < 10)
            result += "0";
        result += "" + mi;
    }
    if (length >= 14) {
        var s = dateObj.getSeconds();
        if (s < 10)
            result += "0";
        result += "" + s;
    }
    //return result;
};

/**
 * 将已格式化的字符串，解析成日期对象
 *
 * @param String str 已格式化的字符串
 * @param String fmt 格式化规则
 * @return Date
 */
if (!Date.parseDate) {
    Date.parseDate = function (str, fmt) {
        var y = 0;
        var m = -1;
        var d = 0;
        var a = str.split(/\W+/);
        if (!fmt) {
            fmt = "%Y-%m-%d";
        }
        var b = fmt.match(/%./g);
        var i = 0;
        var hr = 0;
        var min = 0;
        for (i = 0; i < a.length; ++i) {
            if (!a[i])
                continue;
            switch (b[i]) {
                case "%d":
                case "%e":
                    d = parseInt(a[i], 10);
                    break;

                case "%m":
                    m = parseInt(a[i], 10) - 1;
                    break;

                case "%Y":
                case "%y":
                    y = parseInt(a[i], 10);
                    (y < 100) && (y += (y > 29) ? 1900 : 2000);
                    break;

                case "%H":
                case "%I":
                case "%k":
                case "%l":
                    hr = parseInt(a[i], 10);
                    break;

                case "%P":
                case "%p":
                    if (/pm/i.test(a[i]) && hr < 12)
                        hr += 12;
                    break;

                case "%M":
                    min = parseInt(a[i], 10);
                    break;
            }
        }
        if (y != 0 && m != -1 && d != 0) {
            return new Date(y, m, d, hr, min, 0);
        }

    };
};
/*
 *判断是否时间（支持yyyy-MM-dd和yyyyMMdd）
 *
 */
DateUtils.isDate = function(sd) {
    var re = /^(1|2)\d\d\d-((0?\d)|(1(0|1|2)))-(((0|1|2)?\d)|(3(0|1)))$/;
    var re2 = /^(\d+)-(\d+)-(\d+)$/;
    if (re.test(sd)) {
        re2.exec(sd);
        yy = Number(RegExp.$1);
        mm = Number(RegExp.$2) - 1;
        dd = Number(RegExp.$3);
        d = new Date(yy, mm, dd);
        if (mm == d.getMonth())
            return 1;
    } else {
        if (sd.length != 8)
            return -1;
        sd = DateUtils.format(sd, "yyyy-MM-dd");
        if (re.test(sd)) {
            re2.exec(sd);
            yy = Number(RegExp.$1);
            mm = Number(RegExp.$2) - 1;
            dd = Number(RegExp.$3);
            d = new Date(yy, mm, dd);
            if (mm == d.getMonth())
                return 1;
        }
    }
    return -1;
};

/*
 *判断是否时间（支持yyyy-MM和yyyyMM）
 *
 */
DateUtils.isDate2 = function(sd) {
    var re = /^(1|2)\d\d\d-((0?\d)|(1(0|1|2)))$/;
    var re2 = /^(\d+)-(\d+)$/;
    if (re.test(sd)) {
        re2.exec(sd);
        yy = Number(RegExp.$1);
        mm = Number(RegExp.$2) - 1;
        dd = 1;
        d = new Date(yy, mm, dd);
        if (mm == d.getMonth())
            return 1;
    } else {
        if (sd.length != 6)
            return -1;
        sd = DateUtils.format(sd, "yyyy-MM");
        if (re.test(sd)) {
            re2.exec(sd);
            yy = Number(RegExp.$1);
            mm = Number(RegExp.$2) - 1;
            dd = 1;
            d = new Date(yy, mm, dd);
            if (mm == d.getMonth())
                return 1;
        }
    }
    return -1;
};
/*
 *日期比较(支持yyyy-MM-dd和yyyyMMdd)
 *
 */
DateUtils.DateSComp = function(sd1, sd2) {
    var re2 = /^(1|2)\d\d\d-((0?\d)|(1(0|1|2)))-(((0|1|2)?\d)|(3(0|1)))$/;
    var re = /^(\d+)-(\d+)-(\d+)$/;
    if (re2.test(sd1)) {
        if (re2.test(sd2)) {
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            return( d1 - d2 );
        } else {
            sd2 = DateUtils.format(sd2, "yyyy-MM-dd");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            return( d1 - d2 );
        }
    } else {
        if (re2.test(sd2)) {
            sd1 = DateUtils.format(sd1, "yyyy-MM-dd");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            return( d1 - d2 );
        } else {
            sd1 = DateUtils.format(sd1, "yyyy-MM-dd");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            sd2 = DateUtils.format(sd2, "yyyy-MM-dd");
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, Number(RegExp.$3));
            return( d1 - d2 );
        }
    }
};
/*
 *日期比较(支持yyyy-MM和yyyyMM)
 *
 */
DateUtils.DateSComp2 = function(sd1, sd2) {
    var re2 = /^(1|2)\d\d\d-((0?\d)|(1(0|1|2)))$/;
    var re = /^(\d+)-(\d+)$/;
    if (re2.test(sd1)) {
        if (re2.test(sd2)) {
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            return( d1 - d2 );
        } else {
            sd2 = DateUtils.format(sd2, "yyyy-MM");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            return( d1 - d2 );
        }
    } else {
        if (re2.test(sd2)) {
            sd1 = DateUtils.format(sd1, "yyyy-MM");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            return( d1 - d2 );
        } else {
            sd1 = DateUtils.format(sd1, "yyyy-MM");
            re.exec(sd1);
            d1 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            sd2 = DateUtils.format(sd2, "yyyy-MM");
            re.exec(sd2);
            d2 = new Date(Number(RegExp.$1), Number(RegExp.$2) - 1, 1);
            return( d1 - d2 );
        }
    }
};

/*------------------- SimpleListUtils 针对简要列表 ------------------------------*/

SimpleListUtils = Class.create();

/**
 * 判断简要列表是否有选中
 *
 * @param simpleListObj 简要列表对象
 */
SimpleListUtils.hasSelected = function(simpleListObj) {
    var selectedId = simpleListObj.getSelectedId();

    return (selectedId != null && selectedId != "");
};

/**
 * 判断简要列表是否是多选
 *
 * @param simpleListObj 简要列表对象
 */
SimpleListUtils.isMultiSelected = function(simpleListObj) {
    var selectedId = simpleListObj.getSelectedId();

    if (selectedId == null || selectedId == "")
        return false;

    return (selectedId.indexOf(",") > -1);
};

/**
 * 判断对简要列表单选进行验证
 *
 * @param simpleListObj 简要列表对象
 */
SimpleListUtils.checkSingleSelection = function(simpleListObj) {

    if (!SimpleListUtils.hasSelected(simpleListObj)) {

        alert("请选择一条要操作的记录");
        return false;
    }

    if (SimpleListUtils.isMultiSelected(simpleListObj)) {
        alert("只能操作一条记录，您选择的记录数过多。");
        return false;
    }

    return true;
};
/**
 * 判断对简要列表进行验证
 *
 * @param simpleListObj 简要列表对象
 */
SimpleListUtils.checkSimpList = function(simpleListObj) {

    if (!SimpleListUtils.hasSelected(simpleListObj)) {

        alert("请选择一条要操作的记录");
        return false;
    }
    return true;
};
/**
 * 取得简要列表的更新键
 * 注意：这要求该列显示在第一个列，该方法后期会更改
 * add by chenmk 2007.12.19
 *
 * @param simpleListObj 简要列表对象
 */
SimpleListUtils.getUpdateKey = function(simpleListObj) {
    return simpleListObj.getCellValues(simpleListObj.getSelectedId() - 1, 0);
};

/**
 * 取得选中行的ID，之所以提供该方法，是为了保证但点击链接列时，该行能自动选中
 * add by chenmk 2008.09.11
 *
 * @param {} simpleListObj
 * @param {} primaryKey 主键列
 */
SimpleListUtils.getLinkSelectedId = function(simpleListObj, primaryKey) {
    var result = null;
    var rowNum = simpleListObj.getRowsNum();
    var primaryColNum = simpleListObj.primaryCol;

    if (!primaryColNum || primaryColNum < 0) {
        alert("没有定义主键列");
        return;
    }
    for (var i = 0; i < rowNum; i++) {
        var pk = simpleListObj.getCellValues(i, primaryColNum);
        if (pk == primaryKey) {
            simpleListObj.setSelectedRow(i + 1, null, null, true);  //先选中当行
            simpleListObj.selectAndCheck();     //再选中checkBOX
            result = simpleListObj.getSelectedId();
            break;
        }
    }
    return result;
};

/**
 * 根据主键ID来取得选中的行
 * add by chenmk 2008.09.11
 *
 * @param {} simpleListObj
 * @param {} objId
 */
SimpleListUtils.getSelectedIdByObjId = function(simpleListObj, objId) {
    var rowNum = simpleListObj.getRowsNum();
    var primaryColNum = simpleListObj.primaryCol;

    if (!primaryColNum || primaryColNum < 0) {
        alert("没有定义主键列");
        return;
    }
    for (var i = 0; i < rowNum; i++) {
        var pk = simpleListObj.getCellValues(i, primaryColNum);
        if (pk == objId)
            return i + 1;
    }
};

/**
 * 根据给定的列名来取得该列的值,该方法针对链接列的取值
 * add by chenmk 2008.09.11
 *
 * @param {} simpleListObj
 * @param {} colName 列名
 * @return {}
 */
SimpleListUtils.getColumnValueByLink = function(simpleListObj, primaryKey, colName) {
    var colNameAndIndexMap = simpleListObj.colNameAndIndexRelate;
    var colIndex = colNameAndIndexMap[colName];
    var selectedId = SimpleListUtils.getLinkSelectedId(simpleListObj, primaryKey);
    return simpleListObj.getCellValues(selectedId - 1, colIndex);
};

/**
 * 根据给定的列名来取得该列的值
 * add by chenmk 2008.09.11
 *
 * @param {} simpleListObj
 * @param {} colName 列名
 * @return {}
 */
SimpleListUtils.getColumnValue = function(simpleListObj, colName) {
    var colNameAndIndexMap = simpleListObj.colNameAndIndexRelate;
    var colIndex = colNameAndIndexMap[colName];
    var selectedId = simpleListObj.getSelectedId();
    return simpleListObj.getCellValues(selectedId - 1, colIndex);
};

/**
 * 根据给定objID和列名来取得该列的值
 * add by chenmk 2008.09.11
 *
 * @param {} simpleListObj
 * @param {} objId
 * @param {} colName
 * @return {}
 */
SimpleListUtils.getColumnValueByObjId = function(simpleListObj, objId, colName) {
    var colNameAndIndexMap = simpleListObj.colNameAndIndexRelate;
    var colIndex = colNameAndIndexMap[colName];
    var selectedId = SimpleListUtils.getSelectedIdByObjId(simpleListObj, objId);
    return simpleListObj.getCellValues(selectedId - 1, colIndex);
};